# yun-cha-coffee PyCharm
# coffeeCategory Y
# 2025/8/30 下午5:00


from fastapi import APIRouter, HTTPException, Query
from typing import Union, List, Optional

from django.db.models import Count

from app.models import *
from pydantic import BaseModel, validator, Field

coffeeCategory_api = APIRouter(prefix="/coffeeCategory")
merchandiseCategory_api = APIRouter(prefix="/merchandiseCategory")
#咖啡豆表
@coffeeCategory_api.get("/",summary="查询所有的咖啡豆分类")
async def getAllCoffeeCategorys():
    # 查询所有
    try:
        coffeeCategorys = await CoffeeCategory.all()

        return {
            "code":200,
            "message":"查询成功",
            "data":coffeeCategorys
        }
    except:
        return {
            "code":404,
            "message":"查询失败"
        }

#根据分页展示咖啡豆分类
@coffeeCategory_api.get("/page",summary="分页查询所有的咖啡豆分类")
async def getAllCoffeeCategorysPage(
        page: int = Query(1, ge=1, description="页码，从1开始"),
        limit: int = Query(10, ge=1, le=100, description="每页数量，1-100之间")
):
    try:

        # 基础查询
        query = CoffeeCategory.all()

        # 获取总数（用于分页）
        total = await query.count()

        # 计算偏移量
        offset = (page - 1) * limit

        # 执行查询（带分页）
        CoffeeCategorys = await query.offset(offset).limit(limit).all()

        # 计算总页数
        total_pages = (total + limit - 1) // limit if total > 0 else 0

        # 返回响应
        return {
            "code": 200,
            "message": "查询成功",
            "data": {
                "CoffeeCategorys": CoffeeCategorys,
                "pagination": {
                    "page": page,
                    "limit": limit,
                    "total": total,
                    "total_pages": total_pages,
                    "has_next": page < total_pages,
                    "has_prev": page > 1,
                }
            }
        }

    except Exception as e:
        # 记录错误日志（实际项目中建议使用 logger）
        print(f"获取咖啡产品列表失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"服务器错误: {str(e)}")


#查询某一个咖啡的分类
@coffeeCategory_api.get("/{id}",summary="查询某一个咖啡的分类")
async def getOneCoffeeCategory(id:int):
    try:
        coffeeCategory = await CoffeeCategory.get(id=id)
        return {
            "code": 200,
            "message": "查询成功",
            "data": coffeeCategory
        }
    except:
        return {
            "code":404,
            "message":"查询失败"
        }

#添加咖啡豆分类
class CoffeeCategoryIn(BaseModel):
    name: str
    description: Optional[str]
    beantype_image: Union[str, None] = Field(None, max_length=200)
    parent_id: Optional[int]
    sort_order: int
    is_active: bool

    class Config:
        from_attributes = True

@coffeeCategory_api.post("/",summary="添加咖啡豆分类")
async def addCoffeeCategory(coffeeCategory:CoffeeCategoryIn):
    # 处理 parent_id（如果为0则设为None，表示顶级分类）
    parent_id = coffeeCategory.parent_id if coffeeCategory.parent_id != 0 else None
    # 验证父分类是否存在（如果不是顶级分类）
    if parent_id is not None:
        parent_exists = await CoffeeCategory.filter(id=parent_id).exists()
        if not parent_exists:
            raise HTTPException(
                status_code=400,
                detail=f"父分类ID {parent_id} 不存在"
            )

    await CoffeeCategory.create(name=coffeeCategory.name,description=coffeeCategory.description,beantype_image=coffeeCategory.beantype_image,parent_id=parent_id,sort_order=coffeeCategory.sort_order,is_active=coffeeCategory.is_active)

    return {
        "code":200,
        "message":"添加成功"
    }

#删除咖啡豆分类
@coffeeCategory_api.delete("/{id}",summary="删除咖啡豆分类")
async def deleteCoffeeCategory(id:int):
    await CoffeeCategory.filter(id=id).delete()

    return {
        "code":200,
        "message":"删除成功"
    }

#修改咖啡豆分类
@coffeeCategory_api.put("/{id}",summary="修改咖啡豆分类")
async def updateCoffeeCategory(id:int,coffeeCategory:CoffeeCategoryIn):
    coffeeCategory_list = coffeeCategory.dict()

    await CoffeeCategory.filter(id=id).update(**coffeeCategory_list)

    return {
        "code":200,
        "message":"修改成功"
    }


#周边产品
#查询所有周边产品分类
@merchandiseCategory_api.get("/",summary="查询所有的周边产品分类")
async def getAllMerchandiseCategorys():
    # 查询所有
    try:
        merchandiseCategorys = await MerchandiseCategory.all()

        return {
            "code":200,
            "message":"查询成功",
            "data":merchandiseCategorys
        }
    except:
        return {
            "code":404,
            "message":"查询失败"
        }

#根据分页展示周边产品分类
@merchandiseCategory_api.get("/page",summary="分页查询所有的周边产品分类")
async def getAllMerchandiseCategorysPage(
        page: int = Query(1, ge=1, description="页码，从1开始"),
        limit: int = Query(10, ge=1, le=100, description="每页数量，1-100之间")
):
    try:

        # 基础查询
        query = MerchandiseCategory.all()

        # 获取总数（用于分页）
        total = await query.count()

        # 计算偏移量
        offset = (page - 1) * limit

        # 执行查询（带分页）
        MerchandiseCategorys = await query.offset(offset).limit(limit).all()

        # 计算总页数
        total_pages = (total + limit - 1) // limit if total > 0 else 0

        # 返回响应
        return {
            "code": 200,
            "message": "查询成功",
            "data": {
                "MerchandiseCategorys": MerchandiseCategorys,
                "pagination": {
                    "page": page,
                    "limit": limit,
                    "total": total,
                    "total_pages": total_pages,
                    "has_next": page < total_pages,
                    "has_prev": page > 1,
                }
            }
        }

    except Exception as e:
        # 记录错误日志（实际项目中建议使用 logger）
        print(f"获取咖啡产品列表失败: {str(e)}")
        raise HTTPException(status_code=500, detail=f"服务器错误: {str(e)}")

#查询某一个周边产品的分类
@merchandiseCategory_api.get("/{id}",summary="查询某一个周边产品的分类")
async def getOneMerchandiseCategory(id:int):
    try:
        merchandiseCategory = await MerchandiseCategory.get(id=id)

        return {
            "code":200,
            "message":"查询成功",
            "data":merchandiseCategory
        }
    except:
        return {
            "code":404,
            "message":"查询失败"
        }



#添加周边产品分类
class MerchandiseCategoryIn(BaseModel):
    name:str
    description:Optional[str]
    image_url: Union[str, None] = Field(None, max_length=200)  # 可选，但可能有长度限制
    parent_id:Optional[int]
    sort_order:int
    is_active:bool
    class Config:
        from_attributes = True


@merchandiseCategory_api.post("/",summary="添加周边产品分类")
async def addMerchandiseCategory(merchandiseCategory:MerchandiseCategoryIn):
    # 处理 parent_id（如果为0则设为None，表示顶级分类）
    parent_id = merchandiseCategory.parent_id if merchandiseCategory.parent_id != 0 else None
    # 验证父分类是否存在（如果不是顶级分类）
    if parent_id is not None:
        parent_exists = await MerchandiseCategory.filter(id=parent_id).exists()
        if not parent_exists:
            raise HTTPException(
                status_code=400,
                detail=f"父分类ID {parent_id} 不存在"
            )
    await MerchandiseCategory.create(name=merchandiseCategory.name,description=merchandiseCategory.description,image_url=merchandiseCategory.image_url,sort_order=merchandiseCategory.sort_order,is_active=merchandiseCategory.is_active,parent_id=merchandiseCategory.parent_id)

    return {
        "code":200,
        "message":"添加成功"
    }


#删除周边产品分类
@merchandiseCategory_api.delete("/{id}",summary="删除周边产品分类")
async def deleteMerchandiseCategory(id:int):
    await MerchandiseCategory.filter(id=id).delete()

    return {
        "code":200,
        "message":"删除成功"
    }



#修改周边产品分类
@merchandiseCategory_api.put("/{id}",summary="修改周边产品分类")
async def updateMerchandiseCategory(id,merchandiseCategory:MerchandiseCategoryIn):
    merchandiseCategory_list = merchandiseCategory.dict()

    await MerchandiseCategory.filter(id=id).update(**merchandiseCategory_list)

    return{
        "code": 200,
        "message": "success",
        "data": {}
    }